package join.model.beans;

import java.util.Date;
import java.util.Formatter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import join.util.AppListUtil;
import join.util.FormatterUtil;
import join.util.RepositoryUtil;

import org.springframework.format.annotation.DateTimeFormat;

@Entity
@Table(name="proyecto", schema=RepositoryUtil.ESQUEMA_NOMBRE)
public class Proyecto {

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name ="id", nullable=false)
	private Long id;
	@Column(name ="empresa", nullable=false)
	private Integer empresa;
	@Column(name ="ano", nullable=false)
	private Integer ano;
	@Column(name ="codigo", nullable=false)
	private Long codigo;
	@Column(name ="tipo", nullable=false)
	private Long tipo;
	@Column(name ="nombre", nullable=false)
	private String nombre;
	@Column(name ="descripcion", nullable=true)
	private String descripcion;
	@Column(name ="responsable", nullable=true)
	private String responsable;
	@Column(name ="usuario", nullable=false)
	private String usuario;
	@Column(name ="inicio", nullable=true)
	@DateTimeFormat(pattern = FormatterUtil.DATE_FORMAT)
	private Date inicio;
	@Column(name ="fin", nullable=true)
	@DateTimeFormat(pattern = FormatterUtil.DATE_FORMAT)
	private Date fin;
	@Column(name ="fase", nullable=true)
	private String fase;
	@Column(name ="estado", nullable=false)
	private String estado;
	@Column(name ="dependencia", nullable=true)
	private String dependencia;
	@Column(name ="entidades", nullable=true)
	private String entidades;
	@Column(name ="inicio_estimado", nullable=true)
	@DateTimeFormat(pattern = FormatterUtil.DATE_FORMAT)
	private Date inicioEstimado;
	@Column(name ="fin_estimado", nullable=true)
	@DateTimeFormat(pattern = FormatterUtil.DATE_FORMAT)
	private Date finEstimado;
	@Column(name ="cronograma", nullable=true)
	private Long cronograma;
	@Column(name ="cronograma_guia", nullable=true)
	private Long cronogramaGuia;
	@Column(name ="avance_tiempo", nullable=true)
	private Double avanceTiempo;
	@Column(name ="avance_costo", nullable=true)
	private Double avanceCosto;
	
	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}



	/**
	 * @param id the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}



	/**
	 * @return the empresa
	 */
	public Integer getEmpresa() {
		return empresa;
	}



	/**
	 * @param empresa the empresa to set
	 */
	public void setEmpresa(Integer empresa) {
		this.empresa = empresa;
	}



	/**
	 * @return the ano
	 */
	public Integer getAno() {
		return ano;
	}



	/**
	 * @param ano the ano to set
	 */
	public void setAno(Integer ano) {
		this.ano = ano;
	}



	/**
	 * @return the codigo
	 */
	public Long getCodigo() {
		return codigo;
	}



	/**
	 * @param codigo the codigo to set
	 */
	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}



	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}



	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}



	/**
	 * @return the descripcion
	 */
	public String getDescripcion() {
		return descripcion;
	}



	/**
	 * @param descripcion the descripcion to set
	 */
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}



	/**
	 * @return the responsable
	 */
	public String getResponsable() {
		return responsable;
	}



	/**
	 * @param responsable the responsable to set
	 */
	public void setResponsable(String responsable) {
		this.responsable = responsable;
	}



	/**
	 * @return the usuario
	 */
	public String getUsuario() {
		return usuario;
	}



	/**
	 * @param usuario the usuario to set
	 */
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}



	/**
	 * @return the inicia
	 */
	public Date getInicio() {
		return inicio;
	}



	/**
	 * @param inicia the inicia to set
	 */
	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}



	/**
	 * @return the fin
	 */
	public Date getFin() {
		return fin;
	}



	/**
	 * @param fin the fin to set
	 */
	public void setFin(Date fin) {
		this.fin = fin;
	}



	/**
	 * @return the fase
	 */
	public String getFase() {
		return fase;
	}



	/**
	 * @param fase the fase to set
	 */
	public void setFase(String fase) {
		this.fase = fase;
	}



	/**
	 * @return the estado
	 */
	public String getEstado() {
		return estado;
	}



	/**
	 * @param estado the estado to set
	 */
	public void setEstado(String estado) {
		this.estado = estado;
	}



	/**
	 * @return the dependencia
	 */
	public String getDependencia() {
		return dependencia;
	}



	/**
	 * @param dependencia the dependencia to set
	 */
	public void setDependencia(String dependencia) {
		this.dependencia = dependencia;
	}



	/**
	 * @return the entidades
	 */
	public String getEntidades() {
		return entidades;
	}



	/**
	 * @param entidades the entidades to set
	 */
	public void setEntidades(String entidades) {
		this.entidades = entidades;
	}

	/**
	 * @return the inicioEstimado
	 */
	public Date getInicioEstimado() {
		return inicioEstimado;
	}



	/**
	 * @param inicioEstimado the inicioEstimado to set
	 */
	public void setInicioEstimado(Date inicioEstimado) {
		this.inicioEstimado = inicioEstimado;
	}



	/**
	 * @return the finEstimado
	 */
	public Date getFinEstimado() {
		return finEstimado;
	}



	/**
	 * @param finEstimado the finEstimado to set
	 */
	public void setFinEstimado(Date finEstimado) {
		this.finEstimado = finEstimado;
	}

	/**
	 * @return the cronograma
	 */
	public Long getCronograma() {
		return cronograma;
	}

	/**
	 * @param cronograma the cronograma to set
	 */
	public void setCronograma(Long cronograma) {
		this.cronograma = cronograma;
	}

	/**
	 * @return the cronogramaGuia
	 */
	public Long getCronogramaGuia() {
		return cronogramaGuia;
	}

	/**
	 * @param cronogramaGuia the cronogramaGuia to set
	 */
	public void setCronogramaGuia(Long cronogramaGuia) {
		this.cronogramaGuia = cronogramaGuia;
	}



	/**
	 * @return the avanceTiempo
	 */
	public Double getAvanceTiempo() {
		return avanceTiempo;
	}

	/**
	 * @param avanceTiempo the avanceTiempo to set
	 */
	public void setAvanceTiempo(Double avanceTiempo) {
		this.avanceTiempo = avanceTiempo;
	}

	/**
	 * @return the avanceCosto
	 */
	public Double getAvanceCosto() {
		return avanceCosto;
	}

	/**
	 * @param avanceCosto the avanceCosto to set
	 */
	public void setAvanceCosto(Double avanceCosto) {
		this.avanceCosto = avanceCosto;
	}

	/**
	 * Obtener formato del proyecto
	 * @return
	 */
	public String getCodigoFormato() {
		String formato = "";
		
		if (getAno()!=null && getCodigo()!=null){
			Formatter fmt = new Formatter();
			formato = "PRY-" + getAno() + "-" + fmt.format("%04d",getCodigo()); 
			fmt.close();
		}
		
		return formato;
	}
	
	/**
	 * Obtener formato del proyecto
	 * @return
	 */
	public String getEstadoNombre() {
		return AppListUtil.listaProcesoTexto("proyectoEstado", getEstado());
	}
	
	/**
	 * Obtener formato del proyecto
	 * @return
	 */
	public String getFaseNombre() {
		return AppListUtil.listaProcesoTexto("proyectoFase", getFase());
	}

	/**
	 * Obtener formato del proyecto
	 * @return
	 */
	public String getTipoNombre() {
		String nombre = "";
		
		if (getTipo()!=null){
			nombre = AppListUtil.listaProcesoTexto("proyectoTipo", getTipo().toString());
		}
		
		return nombre;
	}

	/**
	 * @return the tipo
	 */
	public Long getTipo() {
		return tipo;
	}


	/**
	 * @param tipo the tipo to set
	 */
	public void setTipo(Long tipo) {
		this.tipo = tipo;
	}
}